package com.dmatek.uwb.packet.ianalysis.handler;
import java.net.InetSocketAddress;
import com.dmatek.uwb.packet.ianalysis.IAnalysisLocatorPack;
import com.dmatek.uwb.util.tool.AnalyticalUtil;
/**   
 * 解析数据包的抽象类
 * @author zhangfu  
 * @date 2019年12月3日 下午1:56:29 
 * @version V1.0   
 */
public abstract class BaseAnalysisPackHandler implements IAnalysisLocatorPack {
	@Override
	public boolean analysisPack(byte[] data, InetSocketAddress address) throws Exception {
		// 第一次从数据包的开始位置找到结束位置, 如果数据包包头存在则 index >= 0
		byte head = getPacketHeader();
		int size = getPacketSize();
		int index = AnalyticalUtil.find(head, data);
		boolean isHandled = false;
		while (index >= 0) { // 存在数据包的包头时，才进行处理
			// 必须判断剩下的数据包的长度是否满足条件, 不满足条件时，我们应该直接break
			if(index + size > data.length) {
				break;
			}
			// 在不同的模板方法中解析数据包
			if (templateMethod(data, data.length, address, index)) {
				// 模板方法返回true, 说明处理成功
				isHandled = true;
			}
			// 为了防止粘包, 这里继续从index + 1后面开始查找, 直到所有的数据都处理完成后 index变为 < 0, 我们退出本次循环
			index = AnalyticalUtil.findLimitWithOrigin(index + 1, head, data, data.length);
		}
		return isHandled;
	}
	// 所有的处理消息的模板类
	public abstract boolean templateMethod(byte[] temps, int limit, InetSocketAddress sendAddress, int index) throws Exception;
	// 数据包的包头
	public abstract byte getPacketHeader();
	
	public abstract int getPacketSize();
}
